import { ossService } from '../utils/OSSService';
import { validateOSSConfig } from '../config/oss';
import fs from 'fs/promises';
import path from 'path';

async function testOSSConfiguration() {
  console.log('🚀 开始测试阿里云OSS配置...\n');

  try {
    // 1. 验证配置
    console.log('1️⃣ 验证OSS配置...');
    const isConfigValid = validateOSSConfig();
    if (!isConfigValid) {
      throw new Error('OSS配置验证失败');
    }
    console.log('✅ OSS配置验证通过\n');

    // 2. 测试列举存储桶
    console.log('2️⃣ 测试列举存储桶...');
    const bucketsResult = await ossService.listBuckets();
    if (!bucketsResult.success) {
      throw new Error(`列举存储桶失败: ${bucketsResult.error}`);
    }
    console.log('✅ 存储桶列举成功');
    console.log('📦 存储桶列表:', bucketsResult.buckets?.map(b => b.name) || []);
    console.log('');

    // 3. 测试列举文件
    console.log('3️⃣ 测试列举文件...');
    const objectsResult = await ossService.listObjects({ maxKeys: 5 });
    if (!objectsResult.success) {
      throw new Error(`列举文件失败: ${objectsResult.error}`);
    }
    console.log('✅ 文件列举成功');
    console.log('📁 文件数量:', objectsResult.objects?.length || 0);
    if (objectsResult.objects && objectsResult.objects.length > 0) {
      console.log('📄 前5个文件:');
      objectsResult.objects.slice(0, 5).forEach((obj, index) => {
        console.log(`   ${index + 1}. ${obj.name} (${obj.size} bytes)`);
      });
    }
    console.log('');

    // 4. 测试文件上传（创建一个测试文件）
    console.log('4️⃣ 测试文件上传...');
    const testContent = `OSS测试文件\n创建时间: ${new Date().toISOString()}\n这是一个测试文件，用于验证OSS上传功能。`;
    const testBuffer = Buffer.from(testContent, 'utf8');
    const testFileName = ossService.generateFileName('test.txt', 'test-uploads');

    const uploadResult = await ossService.uploadBuffer(testBuffer, testFileName);
    if (!uploadResult.success) {
      throw new Error(`文件上传失败: ${uploadResult.error}`);
    }
    console.log('✅ 文件上传成功');
    console.log('🔗 文件URL:', uploadResult.url);
    console.log('🔑 文件Key:', uploadResult.key);
    console.log('');

    // 5. 测试文件存在性检查
    console.log('5️⃣ 测试文件存在性检查...');
    const existsResult = await ossService.exists(testFileName);
    if (!existsResult.success) {
      throw new Error(`文件存在性检查失败: ${existsResult.error}`);
    }
    console.log('✅ 文件存在性检查成功');
    console.log('📍 文件是否存在:', existsResult.exists ? '是' : '否');
    console.log('');

    // 6. 测试生成签名URL
    console.log('6️⃣ 测试生成签名URL...');
    const signedUrlResult = await ossService.getSignedUrl(testFileName, 3600);
    if (!signedUrlResult.success) {
      throw new Error(`生成签名URL失败: ${signedUrlResult.error}`);
    }
    console.log('✅ 签名URL生成成功');
    console.log('🔐 签名URL:', signedUrlResult.url);
    console.log('');

    // 7. 清理测试文件
    console.log('7️⃣ 清理测试文件...');
    const deleteResult = await ossService.deleteFile(testFileName);
    if (!deleteResult.success) {
      console.warn(`⚠️ 清理测试文件失败: ${deleteResult.error}`);
    } else {
      console.log('✅ 测试文件清理成功');
    }
    console.log('');

    console.log('🎉 所有OSS功能测试通过！');
    console.log('✨ 阿里云OSS配置正确，可以正常使用。');

  } catch (error) {
    console.error('❌ OSS测试失败:', error instanceof Error ? error.message : error);
    console.log('\n🔍 请检查以下配置：');
    console.log('1. .env文件中的OSS配置是否正确');
    console.log('2. AccessKey ID和AccessKey Secret是否有效');
    console.log('3. 存储桶名称是否存在且有访问权限');
    console.log('4. OSS区域设置是否正确');
    process.exit(1);
  }
}

// 运行测试
if (require.main === module) {
  testOSSConfiguration().catch(console.error);
}

export { testOSSConfiguration };